// 2025.09.03 18:03:03 星期三 晴 无事
// 找寻 祖先元素

/**
 * 查询 满足 条件 的 祖先元素
 * @param {HTMLElement} element 元素
 * @param {Function} cb 回调函数
 */
function seekElement_callback(element: HTMLElement | null, cb: Function) {
  if (element == null) {
    return null;
  }

  if (element.nodeName == 'BODY') {
    // console.log('seek arrive body element');
    return null;
  }

  if (cb(element)) {
    return element;
  }

  return seekElement_callback(element.parentNode as HTMLElement, cb);
}

/**
 * 找寻 祖先元素
 * 直到 找到 祖先元素 指定 或 找到 body 元素 为止
 * @param element 当前 元素
 * @param idStr 目标 祖先元素 id
 * @returns
 */
export function seekElement_id(element: HTMLElement | null, idStr: string) {
  if (element == null) {
    return null;
  }

  let cb_id = (node: HTMLElement) => {
    if (node.id == idStr) {
      return true;
    }
    return false;
  };

  return seekElement_callback(element, cb_id);
}

/**
 * 找寻 特定 类 名 祖先
 * @param cur_dom 当前 元素
 * @param cla 目标 祖先元素 特定 class
 */

export function seekElement_class(cur_dom: HTMLElement, cla: string) {
  if (cur_dom == null) {
    return null;
  }

  let cb_id = (node: HTMLElement) => {
    if (node.classList.contains(cla)) {
      return true;
    }
    return false;
  };

  return seekElement_callback(cur_dom, cb_id);
}

/**
 * 查询 当前 及 祖先元素 的 特定 属性 和 值
 * @param element 当前 元素
 * @param specialKey 特定 属性
 * @param specialValue 特定 属性值
 */
export function seekElement_attribute(
  element: HTMLElement,
  specialKey: string,
  specialValue?: string
) {
  let cb_special_key = (node: HTMLElement) => {
    if (node.hasAttribute(specialKey)) {
      if (specialValue != undefined) {
        if (node.getAttribute(specialKey) == specialValue) {
          return true;
        } else {
          return false;
        }
      }
      return true;
    }
    return false;
  };

  return seekElement_callback(element, cb_special_key);
}
